package com.morgan.test;

/**
 * Map 有一个微妙的并发 bug，这个 bug 将许多不知情的 Java 开发人员引入歧途。
 * ConcurrentMap 是最容易的解决方案。

当一个 Map 被从多个线程访问时，通常使用 containsKey() 或者 get() 来查看给定键是否在存储键/值对之前出现。
但是即使有一个同步的 Map，线程还是可以在这个过程中潜入，然后夺取对 Map 的控制权。
问题是，在对 put() 的调用中，锁在 get() 开始时获取，然后在可以再次获取锁之前释放。
它的结果是个竞争条件：这是两个线程之间的竞争，结果也会因谁先运行而不同。

如果两个线程几乎同时调用一个方法，两者都会进行测试，调用 put，在处理中丢失第一线程的值。
幸运的是，ConcurrentMap 接口支持许多附加方法，
它们设计用于在一个锁下进行两个任务：putIfAbsent()，
例如，首先进行测试，然后仅当键没有存储在 Map 中时进行 put。

 * @author morgan.liao
 *
 */

public class CTConcurrentMap {

}
